/**
 *
 * FileName: vector.c
 * Author: MagicKingC
 * @brief cm3内核的中断向量表
 * @version 0.1
 *
 *
 */
#include <mkinc.h>

// void ResetISR(void);
static void NmiISR(void);
static void FaultISR(void);
static void IntDefaultHandler(void);

extern unsigned long _etext;
extern unsigned long _data;
extern unsigned long _edata;
extern unsigned long _stack_bottom;
extern unsigned long _stack_top;

extern void Reset_Handler(void);
extern void SysTick_Handler(void);
extern void PendSV_Handler(void);
extern void SVC_Handler(void);

__attribute__((section(".isr_vector"))) void (*g_pfnVectors[])(void) = {
    0x2000c000,                   // StackPtr, set in RestetISR
    ((__MK_IO32)Reset_Handler + 1),  // The reset handler
    NmiISR,                       // The NMI handler
    FaultISR,                     // The hard fault handler
    IntDefaultHandler,            // The MPU fault handler
    IntDefaultHandler,            // The bus fault handler
    IntDefaultHandler,            // The usage fault handler
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    ((__MK_IO32)SVC_Handler + 1), // SVCall handler
    IntDefaultHandler,            // Debug monitor handler
    0,                            // Reserved
    ((__MK_IO32)PendSV_Handler + 1), // The PendSV handler
    SysTick_Handler,              // The SysTick handler
    IntDefaultHandler,            // GPIO Port A
    IntDefaultHandler,            // GPIO Port B
    IntDefaultHandler,            // GPIO Port C
    IntDefaultHandler,            // GPIO Port D
    IntDefaultHandler,            // GPIO Port E
    IntDefaultHandler,            // UART0 Rx and Tx
    IntDefaultHandler,            // UART1 Rx and Tx
    IntDefaultHandler,            // SSI0 Rx and Tx
    IntDefaultHandler,            // I2C0 Master and Slave
    IntDefaultHandler,            // PWM Fault
    IntDefaultHandler,            // PWM Generator 0
    IntDefaultHandler,            // PWM Generator 1
    IntDefaultHandler,            // PWM Generator 2
    IntDefaultHandler,            // Quadrature Encoder 0
    IntDefaultHandler,            // ADC Sequence 0
    IntDefaultHandler,            // ADC Sequence 1
    IntDefaultHandler,            // ADC Sequence 2
    IntDefaultHandler,            // ADC Sequence 3
    IntDefaultHandler,            // Watchdog timer
    IntDefaultHandler,            // Timer 0 subtimer A
    IntDefaultHandler,            // Timer 0 subtimer B
    IntDefaultHandler,            // Timer 1 subtimer A
    IntDefaultHandler,            // Timer 1 subtimer B
    IntDefaultHandler,            // Timer 2 subtimer A
    IntDefaultHandler,            // Timer 2 subtimer B
    IntDefaultHandler,            // Analog Comparator 0
    IntDefaultHandler,            // Analog Comparator 1
    IntDefaultHandler,            // Analog Comparator 2
    IntDefaultHandler,            // System Control (PLL, OSC, BO)
    IntDefaultHandler,            // FLASH Control
    IntDefaultHandler,            // GPIO Port F
    IntDefaultHandler,            // GPIO Port G
    IntDefaultHandler,            // GPIO Port H
    IntDefaultHandler,            // UART2 Rx and Tx
    IntDefaultHandler,            // SSI1 Rx and Tx
    IntDefaultHandler,            // Timer 3 subtimer A
    IntDefaultHandler,            // Timer 3 subtimer B
    IntDefaultHandler,            // I2C1 Master and Slave
    IntDefaultHandler,            // Quadrature Encoder 1
    IntDefaultHandler,            // CAN0
    IntDefaultHandler,            // CAN1
    IntDefaultHandler,            // CAN2
    IntDefaultHandler,            // Ethernet
    IntDefaultHandler,            // Hibernate
    IntDefaultHandler,            // USB0
    IntDefaultHandler,            // PWM Generator 3
    IntDefaultHandler,            // uDMA Software Transfer
    IntDefaultHandler,            // uDMA Error
    IntDefaultHandler,            // ADC1 Sequence 0
    IntDefaultHandler,            // ADC1 Sequence 1
    IntDefaultHandler,            // ADC1 Sequence 2
    IntDefaultHandler,            // ADC1 Sequence 3
    IntDefaultHandler,            // I2S0
    IntDefaultHandler,            // External Bus Interface 0
    IntDefaultHandler,            // GPIO Port J
    IntDefaultHandler,            // GPIO Port K
    IntDefaultHandler,            // GPIO Port L
    IntDefaultHandler,            // SSI2 Rx and Tx
    IntDefaultHandler,            // SSI3 Rx and Tx
    IntDefaultHandler,            // UART3 Rx and Tx
    IntDefaultHandler,            // UART4 Rx and Tx
    IntDefaultHandler,            // UART5 Rx and Tx
    IntDefaultHandler,            // UART6 Rx and Tx
    IntDefaultHandler,            // UART7 Rx and Tx
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    IntDefaultHandler,            // I2C2 Master and Slave
    IntDefaultHandler,            // I2C3 Master and Slave
    IntDefaultHandler,            // Timer 4 subtimer A
    IntDefaultHandler,            // Timer 4 subtimer B
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    0,                            // Reserved
    IntDefaultHandler,            // Timer 5 subtimer A
    IntDefaultHandler,            // Timer 5 subtimer B
    IntDefaultHandler,            // Wide Timer 0 subtimer A
    IntDefaultHandler,            // Wide Timer 0 subtimer B
    IntDefaultHandler,            // Wide Timer 1 subtimer A
    IntDefaultHandler,            // Wide Timer 1 subtimer B
    IntDefaultHandler,            // Wide Timer 2 subtimer A
    IntDefaultHandler,            // Wide Timer 2 subtimer B
    IntDefaultHandler,            // Wide Timer 3 subtimer A
    IntDefaultHandler,            // Wide Timer 3 subtimer B
    IntDefaultHandler,            // Wide Timer 4 subtimer A
    IntDefaultHandler,            // Wide Timer 4 subtimer B
    IntDefaultHandler,            // Wide Timer 5 subtimer A
    IntDefaultHandler,            // Wide Timer 5 subtimer B
    IntDefaultHandler,            // FPU
    IntDefaultHandler,            // PECI 0
    IntDefaultHandler,            // LPC 0
    IntDefaultHandler,            // I2C4 Master and Slave
    IntDefaultHandler,            // I2C5 Master and Slave
    IntDefaultHandler,            // GPIO Port M
    IntDefaultHandler,            // GPIO Port N
    IntDefaultHandler,            // Quadrature Encoder 2
    IntDefaultHandler,            // Fan 0
    0,                            // Reserved
    IntDefaultHandler,            // GPIO Port P (Summary or P0)
    IntDefaultHandler,            // GPIO Port P1
    IntDefaultHandler,            // GPIO Port P2
    IntDefaultHandler,            // GPIO Port P3
    IntDefaultHandler,            // GPIO Port P4
    IntDefaultHandler,            // GPIO Port P5
    IntDefaultHandler,            // GPIO Port P6
    IntDefaultHandler,            // GPIO Port P7
    IntDefaultHandler,            // GPIO Port Q (Summary or Q0)
    IntDefaultHandler,            // GPIO Port Q1
    IntDefaultHandler,            // GPIO Port Q2
    IntDefaultHandler,            // GPIO Port Q3
    IntDefaultHandler,            // GPIO Port Q4
    IntDefaultHandler,            // GPIO Port Q5
    IntDefaultHandler,            // GPIO Port Q6
    IntDefaultHandler,            // GPIO Port Q7
    IntDefaultHandler,            // GPIO Port R
    IntDefaultHandler,            // GPIO Port S
    IntDefaultHandler,            // PWM 1 Generator 0
    IntDefaultHandler,            // PWM 1 Generator 1
    IntDefaultHandler,            // PWM 1 Generator 2
    IntDefaultHandler,            // PWM 1 Generator 3
    IntDefaultHandler             // PWM 1 Fault
};

static void NmiISR(void) {
    mkprintk("NmiISR\n");
    while (1);
}

static void FaultISR(void) {
    mkprintk("FaultISR\n");
    while (1);
}

static void IntDefaultHandler(void) {
    mkprintk("IntDefaultHandler\n");
    while (1);
}
